Skip to content

Make DefinitionSerialization can be access publicly 使 DefinitionSerialization 可公共调用 - #102

Merged
WhereisFff merged 2 commits into
Anvil-Dev:dev/1.21.1from
QiuShui1012:fix/1.21.1
Aug 14, 2026
Merged

Make DefinitionSerialization can be access publicly 使 DefinitionSerialization 可公共调用#102
WhereisFff merged 2 commits into
Anvil-Dev:dev/1.21.1from
QiuShui1012:fix/1.21.1

Conversation

@QiuShui1012

Copy link
Copy Markdown
Contributor

No description provided.

@Gugle2308

Copy link
Copy Markdown

All checks done — this is a tiny, self-contained visibility-widening PR. Let me summarize the verification:

  • BlockStatePredicate (in module.util): public class with public CODEC/STREAM_CODEC ✅ — the record component type and the codec references are all externally accessible
  • MultiblockDefinition (same package): already public record ✅ — the public toDefinition()/fromDefinition() signatures are usable
  • CodecUtil.CHAR/StreamCodecUtil.CHAR are in a different package (v2.codec) and were already referenced from package-private fields, so they're public ✅
  • Pure visibility widening, zero behavior change, no EOF/ghost issues

代码审查摘要 — PR #102

操作: opened
范围: 1 个文件 (1 Java, 0 新增, 0 删除) / 42 行 diff
分支: fix/1.21.1dev/1.21.1

变更内容

DefinitionSerialization.java 中 5 处可见性放宽,全部为纯 API 表面修改,无任何行为变化:

  1. recordpublic record(组件的规范构造器与访问器 grid()/mapping() 随之公开)
  2. static final CODECpublic static final
  3. static final STREAM_CODECpublic static final
  4. toDefinition()public
  5. fromDefinition()public

✅ 类型可见性交叉验证

暴露类型 可见性 状态
BlockStatePredicate(组件 mapping 的元素类型) public classCODEC/STREAM_CODEC 均 public
MultiblockDefinitiontoDefinition 返回 / fromDefinition 入参) 同包 public record
CodecUtil.CHAR / StreamCodecUtil.CHAR(public 字段引用) 跨包(v2.codec),本就为 public 才能被现有代码引用
String[][] / Char2ObjectMap / RegistryFriendlyByteBuf 标准库 / fastutil / MC 公开类

编译无风险:改动仅是放宽访问级别,同包内 MultiblockDefinition.CODECDefinitionSerialization.CODEC 的既有引用不受影响。5 处已覆盖文件中全部合理的 package-private 成员(findControllerPos/toList/toArray/toC2OMap/findNewKey 保持私有,正确)。

🔴 关键

⚠️ 警告

💡 建议

  • DefinitionSerialization.java — 组件变为公开后,grid() 暴露的是可变 String[][]mapping() 暴露的 Char2ObjectMap 在外部调用方直接 new DefinitionSerialization(...) 时也可传入可变实例。同包的 MultiblockDefinition@Unmodifiable 注解标明不可变性(且内部用 ImmutableMap),建议保持一致:给 mapping 组件加 @Unmodifiable,或在公开构造器里做防御性拷贝(Char2ObjectMaps.unmodifiable 包装),避免外部代码绕过 codec 路径构造时破坏不可变约定。
  • DefinitionSerialization.java — 现为公开 API,建议补充 Javadoc 说明 CODEC/STREAM_CODEC/toDefinition/fromDefinition 的用途(尤其 '0' 表示控制器位置的约定,toDefinition 对未定义 key 抛 IllegalArgumentException 的行为值得文档化)。

🟢 看起来不错

  • 改动精准、最小化:只放宽需要公开的成员,内部实现细节(findNewKey 的字符回退链等)保持私有
  • 所有公开签名引用的类型均已可见,无泄漏 package-private 类型的隐患
  • 无 EOF 换行缺失、无调试代码、无行为变更,序列化路径(codec round-trip)不受影响

结论: APPROVE — 纯可见性放宽,类型可见性交叉验证全部通过,无阻塞问题。两条建议均为非阻塞的 API 卫生改进(与同包 MultiblockDefinition 的不可变性约定对齐)。

🧪 测试建议

被测目标 推荐测试场景 优先级
DefinitionSerialization 公开后 从外部包调用 codec round-trip(grid 含空格/控制器 '0'/未定义 key 报错路径),验证公开化后行为与之前一致 🟢

由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

代码审查摘要 — PR #102

操作: synchronize
范围: 1 个文件 (1 Java) / 42 行 diff
内容: DefinitionSerialization 由包私有改为 public,并公开 CODECSTREAM_CODECtoDefinition()fromDefinition()。纯可见性扩大,零行为变更。

✅ 公共 API 完整性验证

检查项 结果
record 本身改为 public ✅ 规范构造器 + grid()/mapping() 访问器随 record 自动公开
CODEC / STREAM_CODEC 改为 public static final
toDefinition() / fromDefinition() 改为 public
返回/参数类型全部可公开访问 MultiblockDefinition(public record)、BlockStatePredicate(public class)、fastutil Char2ObjectMap、MC 的 MapCodec/StreamCodec/RegistryFriendlyByteBuf 均为 public
MultiblockDefinition.CODEC/STREAM_CODEC 中的方法引用 DefinitionSerialization::toDefinition/fromDefinition ✅ 仍有效,不受影响
JPMS / module-info 限制 ✅ 无 module-info,公开即对消费方生效
兼容性 ✅ 可见性扩大是向后兼容的,无破坏性

🟢 看起来不错

  • 改动最小且完整——5 处修饰符变更覆盖了外部使用所需的全部入口(构造、编解码、双向转换)。
  • fromDefinition/toDefinitionMultiblockDefinition.CODEC 的解耦方式(方法引用)在公开后无需任何调整。

💡 建议(非阻塞,均为既存设计问题,但类公开后外部调用方会直接遇到)

  • DefinitionSerialization.javaString[][] grid 是可变数组组件:record 的 equals()/hashCode() 对数组按引用比较,结构相等的两个实例 equals 为 false;且 grid() 访问器会暴露内部数组供外部修改。类公开后建议考虑防御性拷贝或改为不可变表示(如 List<List<String>>)。
  • DefinitionSerialization.javaChar2ObjectMap(fastutil)进入公共 API 面在 MC 模组生态可接受,但规范构造器不拦截外部传入的可变 map(unmodifiable 包装只在 toC2OMap 路径生效)。公开 API 文档中可注明该约束。
  • findControllerPos() / fromDefinition() 的边界行为(本 PR 未引入,但外部消费者会踩到):① 网格无 '0' 键时静默回退 Vec3i.ZERO,控制器偏移悄悄失效;② 控制器方块与其他方块共享同一 predicate 且 ZERO 先被迭代时,非 ZERO 方块也会拿到 '0' 键,导致 toDefinition 往返后坐标偏移不稳定。建议在公开文档中说明 '0' 键的约定,或在 fromDefinition 中对重复键做唯一化处理。

📋 声称验证

声称 状态 对应文件
DefinitionSerialization 可公共调用 DefinitionSerialization.java(record + 4 成员全部 public)

结论: APPROVE — 低风险纯可见性扩大,公开面完整、类型面全部可达、无行为变化。上述建议可在后续迭代处理。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'api-exposure-pr-review' (1 replacement).

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ✅ Compatible 0
collision ✅ Compatible 0
config ✅ Compatible 0
integration ✅ Compatible 0
moveable-entity-block ✅ Compatible 0
network ✅ Compatible 0
rendering ⚪ Skipped
space-select ✅ Compatible 0
font ✅ Compatible 0
util ✅ Compatible 0
explosion ✅ Compatible 0
rpc ✅ Compatible 0
multiblock ✅ Compatible 0
recipe ✅ Compatible 0
registrum ✅ Compatible 0
sync ✅ Compatible 0
wheel ✅ Compatible 0
main ✅ Compatible 0

Full CSVs: see the Artifacts section of this workflow run.

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ✅ Compatible 0
collision ✅ Compatible 0
config ✅ Compatible 0
integration ✅ Compatible 0
moveable-entity-block ✅ Compatible 0
network ✅ Compatible 0
rendering ⚪ Skipped
space-select ✅ Compatible 0
font ✅ Compatible 0
util ✅ Compatible 0
explosion ✅ Compatible 0
rpc ✅ Compatible 0
multiblock ✅ Compatible 0
recipe ✅ Compatible 0
registrum ✅ Compatible 0
sync ✅ Compatible 0
wheel ✅ Compatible 0
main ✅ Compatible 0

Full CSVs: see the Artifacts section of this workflow run.

@WhereisFff
WhereisFff merged commit 7380cb5 into Anvil-Dev:dev/1.21.1 Aug 14, 2026
36 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #102 已关闭(closed),按 webhook 审查规则:closed/labeled 事件 → stop here,不执行审查、不发布评论

无需下载 diff,无需分析。本次会话到此结束,不会向 PR 评论区发布任何审查内容。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants